package es.mfp.practicos.dao;

import java.util.Arrays;
import java.util.List;

import javax.persistence.Query;

import org.springframework.stereotype.Repository;

import es.mfp.practicos.DTO.ConsultaConsumosCriteria;
import es.mfp.practicos.domain.Estado;
import es.mfp.practicos.domain.LineaFactura;

@Repository
public class LineaFacturaDAOImpl extends GenericDaoImpl<LineaFactura, Long> implements
		LineaFacturaDAO {

	private static final String QUERY = "SELECT lf FROM LineaFactura lf "
			+ " INNER JOIN lf.lineaTelefonica lt " + " INNER JOIN lf.factura f "
			+ " INNER JOIN lt.titular e " + " WHERE lf.id IS NOT NULL ";

	@SuppressWarnings("unchecked")
	@Override
	public List<LineaFactura> findByCriteria(ConsultaConsumosCriteria criteria) {

		List<LineaFactura> res = null;

		boolean conCodigoFactura = criteria.getIdsFactura() != null
				&& !criteria.getIdsFactura().isEmpty();
		boolean conFechaDesde = criteria.getFacturacionDesde() != null;
		boolean conFechaHasta = criteria.getFacturacionHasta() != null;
		boolean conTipoLinea = criteria.getTiposLinea() != null
				&& criteria.getTiposLinea().length > 0;
		boolean conNumerosTelefono = criteria.getIdsLinea() != null
				&& !criteria.getIdsLinea().isEmpty();
		boolean conEmpleados = criteria.getIdsEmpleado() != null
				&& !criteria.getIdsEmpleado().isEmpty();

		StringBuilder sb = new StringBuilder(QUERY);

		if (criteria.isSoloEmpleadosActivos()) {
			sb.append(" AND lf.lineaTelefonica.titular.estado = :ESTADO_ACTIVO ");
		}

		if (criteria.isSoloFacturasActivas()) {
			sb.append(" AND f.estado = :ESTADO_ACTIVO ");
		}

		if (criteria.isSoloLineasActivas()) {
			sb.append(" AND lf.lineaTelefonica.estado = :ESTADO_ACTIVO ");
		}

		if (conCodigoFactura) {
			sb.append(" AND lf.factura.id IN ( :IDS_FACTURA ) ");
		}

		if (conFechaDesde) {
			sb.append(" AND lf.factura.fechaDesde >= :FECHA_DESDE ");
		}

		if (conFechaHasta) {
			sb.append(" AND lf.factura.fechaHasta <= :FECHA_HASTA ");
		}

		if (conTipoLinea) {
			sb.append(" AND lt.tipo IN ( :TIPOS_LINEA ) ");
		}

		if (conNumerosTelefono) {
			sb.append(" AND lf.lineaTelefonica.id IN ( :IDS_LINEAS_TELEFONO) ");
		}

		if (conEmpleados) {
			sb.append(" AND lf.lineaTelefonica.titular.id IN ( :IDS_EMPLEADOS ) ");
		}

		Query q = getJpaTemplate().getEntityManagerFactory().createEntityManager()
				.createQuery(sb.toString());

		if (criteria.isSoloEmpleadosActivos() || criteria.isSoloFacturasActivas()
				|| criteria.isSoloLineasActivas()) {
			q.setParameter("ESTADO_ACTIVO", Estado.ACTIVO);
		}

		if (conCodigoFactura) {
			q.setParameter("IDS_FACTURA", criteria.getIdsFactura());
		}

		if (conFechaDesde) {
			q.setParameter("FECHA_DESDE", criteria.getFacturacionDesde());
		}

		if (conFechaHasta) {
			q.setParameter("FECHA_HASTA", criteria.getFacturacionHasta());
		}

		if (conTipoLinea) {
			q.setParameter("TIPOS_LINEA", Arrays.asList(criteria.getTiposLinea()));
		}

		if (conNumerosTelefono) {
			q.setParameter("IDS_LINEAS_TELEFONO", criteria.getIdsLinea());
		}

		if (conEmpleados) {
			q.setParameter("IDS_EMPLEADOS", criteria.getIdsEmpleado());
		}

		res = q.getResultList();

		return res;
	}

}
